10.2 XML, HTML und XSL - die Ausgabe
 
Nachdem eine wohlgeformte oder eine gültige XML-Datei erstellt worden ist, stellt sich die Frage, was mit ihr geschieht. Die Anzeige im Internet Explorer ist zur reinen Informationsvermittlung okay, allerdings wenig brauchbar, da die Benutzer von Browsern anderes gewöhnt sind. Die Daten sollen auf vernünftige, das heißt ansehnliche Weise, veröffentlicht werden. Und genau hier greift HTML.
Eine einfache Möglichkeit, XML-Dokumente anzuzeigen, sind Style Sheets.
So wie Dokumente in Textverarbeitungsprogrammen nicht »hart«, sondern mit Formatvorlagen formatiert werden sollten, stellen viele Browser die Möglichkeit zur Verfügung, mit CSS (Cascading Style Sheets) zu arbeiten. Diese Technik wurde vom World Wide Web Consortium 1996 entwickelt und im Netscape 4.0 und Internet Explorer 4.0 vollständig implementiert.
Der dahinter liegende Grundgedanke ist die Trennung von Information und Gestaltung. CSS ist lediglich für das Aussehen eines Dokuments zuständig; in ihm sind keinerlei Informationen über die Struktur des Dokuments verzeichnet. Verzichtet man auf CSS, kann ein aufgeblähter und unübersichtlicher Code entstehen. Mit CSS können kürzere Ladezeiten erreicht werden. Und schließlich ist die Pflege der Formate leichter, wenn CSS verwendet wird.
Ein CSS-Dokument ist eine Datei, in der die Stile für andere HTML-Seiten festgelegt werden. In diesem Kapitel wird darauf allerdings nicht eingegangen - es würde den Rahmen sprengen. Über CSS gibt es inzwischen schon eine ganze Menge Literatur.
10.2.1 XSL
 
Eine weitere und viel elegantere Möglichkeit, die Daten auszugeben und zu formatieren, besteht über XSL (Extensible Stylesheet Language). Während XML die Daten hält und strukturiert, gibt XSL sie aus. Genauer gesagt besteht XSL sogar aus zwei Teilen; der eine transformiert die Daten, der andere formatiert sie. Beide Teile können unabhängig voneinander agieren, machen in der Regel aber erst im Zusammenspiel Sinn. Die Transformationssprache wird häufig XSLT genannt.
10.2.2 Der Aufbau einer XSL-Datei
 
Sehen wir uns ein Beispiel an. Eine XSL-Datei hat folgende Gestalt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<H1>
<xsl:value-of select="Artikel/Buch/Nummer"/>
</H1>
<p>
<xsl:value-of select="Artikel/Buch/Titel"/>
<xsl:value-of select="Artikel/Buch/Gruppe"/>
</p>
</xsl:template>
</xsl:stylesheet>
Sie wird durch das Tag <xsl:stylesheet> eingeleitet. Als Attribut wird der Namensraum definiert (xmlns:xsl=»http://www.w3.org/TR/WD-xsl«). Dieses Tag findet am Ende des Dokuments seine Entsprechung. Das nächste Tag <xsl:template> definiert den Namensraum. Nach dem Doppelpunkt folgt das Schlüsselwort template. Auch dieses Tag findet seine Entsprechung am Ende. Das folgende Tag <H1> ist nun die erste Formatierung (»Heading1«), in welcher sich das Element »Nummer« befindet, oder genauer »Artikel/Buch/Nummer«. »Artikel« ist das Wurzelelement und hat selbst keine Inhalte, kann deshalb auch nicht formatiert werden. Das Attribut value-of liest den Inhalt aus.
Das zweite Tag <p> formatiert die übrigen zwei Elemente und stellt sie im Browser dar.
Diese XSL-Datei muss nun noch in die XML-Datei eingebunden werden. Dies geschieht mit dem Befehl:
<?xml-stylesheet href="XSLFormate10.xsl" type="text/xsl"?>
Auch hier steht diese Zeile direkt nach
<?xml version="1.0" encoding="ISO-8859-1"?>
Wie man an diesem Beispiel sehen kann, wird die XSL-Datei mit der Endung »xsl« gespeichert. Man kann sich diese Datei übrigens auch im Browser anzeigen lassen - die Anzeige entspricht einem XML-Dokument ohne Formatierung.
Abbildung 10.10
Das XML-Dokument wird mit einer XSL-Datei formatiert.
Neben dem Kindelement »xsl:template« stehen noch weitere Elemente zur Verfügung. Auf sie soll nicht weiter eingegangen werden. Hier die vollständige Liste:
Tabelle 10.5
Die Kindelemente von <xsl:stylesheet>
| Element
|
Beschreibung
|
| xsl:import
|
ein XSLT-Stylesheet wird importiert
|
| xsl:include
|
ein XSLT-Stylesheet wird eingebunden
|
| xsl:strip-space
|
tauchen mehrere Leerzeichen im Dokument auf, so werden sie entfernt
|
| xsl:preserve-space
|
tauchen mehrere Leerzeichen im Dokument auf, so bleiben sie erhalten
|
| xsl:output
|
damit kann ein XML-Dokument in ein anderes XML-, ein HTML-Dokument oder eine Textdatei verwandelt werden
|
| xsl:key
|
Schlüssel
|
| xsl:decimal-format
|
bestimmt das Aussehen von reellen Zahlen
|
| xsl:namespace-alias
|
das Namensraumpräfix wird durch ein anderes Präfix ersetzt
|
| xsl:attribute-set
|
Attribute können erzeugt werden
|
| xsl-variable
|
eine Variable wird deklariert
|
| xsl:param
|
eine globale Variable wird deklariert
|
| xls:template
|
damit wird der Knoten bereitgestellt, mit dem das XSLT-Dokument bearbeitet wird
|
10.2.3 Mehrere Kindelemente anzeigen
 
Wenn nun allerdings mehrere Elemente in dem XML-Dokument stehen, so muss die XSL-Datei modifiziert werden. Vom Dokument
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate11.xsl" type="text/xsl"?>
<Artikel>
<Buch>
<Nummer>117</Nummer>
<Titel>Biologisch kochen und backen</Titel>
<Gruppe>Kochbuch</Gruppe>
<Preis>14,90</Preis>
</Buch>
<Buch>
<Nummer>118</Nummer>
<Titel>Meine Rezepte</Titel>
<Gruppe>Kochbuch</Gruppe>
<Preis>44,90</Preis>
</Buch>
<Buch>
<Nummer>119</Nummer>
<Titel>Original italienische Pasta</Titel>
<Gruppe>Kochbuch</Gruppe>
<Preis>38,80</Preis>
</Buch>
</Artikel>
wird unverändert nur das erste Element angezeigt. Damit alle Einträge zu sehen sind, muss das XSL-Dokument mit for-each modifiziert werden:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
<H1>
<xsl:value-of select="Nummer"/>
</H1>
<p>
<xsl:value-of select="Titel"/>
<xsl:value-of select="Gruppe"/>
</p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Zwei Änderungen wurden vorgenommen. Zum einen wurde ein for-each-Tag eingeführt, der alle Elemente von <Artikel/Buch> durchläuft. Nun muss mit dem select-Attribut nicht mehr der gesamte Pfad angegeben werden, sondern nun genügt der Name des Elements. Da sich die drei Elemente »Nummer«, »Titel« und »Buch« auf der gleichen Ebene befinden, können sie problemlos in die for-each-Schleife eingebunden werden.
Abbildung 10.11
Mehrere Elemente werden angezeigt.
Selbstverständlich müssen nicht alle Elemente angezeigt werden. Man könnte XSL auch zur Selektion von Daten heranziehen. Im folgenden Beispiel werden lediglich die Titel angezeigt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
<p>
<xsl:value-of select="Titel"/>
</p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Abbildung 10.12
Es kann auch nur ein Teil angezeigt werden.
Dabei können die wichtigsten HTML-Tags verwendet werden <H1>, <H2>, .. <H6>, <P>, <B>, <I>, <U>, <BIG>, <STRONG>, <SUB>, <SUP>, <SPAN>, <DIV>, <STYLE> und noch einige weitere.
Und damit werden auch die Vorteile der Verwendung von XML und XSL deutlich. Es geht nicht nur um den Import und Export von Daten, sondern sie sollen zugleich auf eine bestimmte Art angezeigt werden. Gerade bei Änderungen wirkt sich die Trennung in Gestaltung und Daten positiv aus. Die Daten können einfach verändert oder neu eingelesen werden, die Formatierung kann leicht geändert werden. Ebenso kann ein Element schnell von einer Formatierungsebene auf eine andere geschoben werden.
10.2.4 Alle Elemente einer Ebene anzeigen
 
Sollen alle Elemente angezeigt werden, ganz gleich, wie sie heißen, dann kann die Selektion mit folgendem Operator durchgeführt werden:
<xsl:value-of select="."/>
10.2.5 Attribute auslesen
 
Befinden sich Werte in Attributen, so können auch diese ausgelesen werden. Im folgenden Dokument besitzt das Element <Buch> das Attribut »Preis«:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate14.xsl" type="text/xsl"?>
<Artikel>
<Buch Preis="14,90">
<Nummer>117</Nummer>
<Titel>Biologisch kochen und backen</Titel>
<Gruppe>Kochbuch</Gruppe>
</Buch>
<Buch Preis="44,90">
<Nummer>118</Nummer>
<Titel>Meine Rezepte</Titel>
<Gruppe>Kochbuch</Gruppe>
</Buch>
<Buch Preis="38,80">
<Nummer>119</Nummer>
<Titel>Original italienische Pasta</Titel>
<Gruppe>Kochbuch</Gruppe>
</Buch>
</Artikel>
Das zugehörige XSL-Dokument liest alle Elemente der Kindknoten »Buch« und sein Attribut »Preis« aus:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
<H1>
<xsl:value-of select="Nummer"/>
</H1>
<p>
<xsl:value-of select="."/>
<xsl:value-of select="@Preis"/>
</p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Beachten Sie, dass sich vor dem Attributnamen ein »@« befindet. Und beachten Sie, dass die Zeile
<xsl:value-of select="."/>
alle Elemente der Ebene »Artikel/Buch« herausholt.
Abbildung 10.13
Auch Attribute können ausgelesen werden.
10.2.6 STYLE in SPAN und DIV
 
Noch flexibler gestaltet sich die Ausgabe, wenn zu den Tags das STYLE-Attribut verwendet wird. Insbesondere die beiden Tags <DIV> und <SPAN> eignen sich dafür, da sie nicht vorbelegt sind, sondern als Attribute die einzelnen Gestaltungsmerkmale erhalten. Sie wurden mit HTML 4.0 eingeführt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
<DIV STYLE="color:red; font-family:Arial; font-size:24pt; font-weight:bold">
<xsl:value-of select="Nummer"/>
</DIV>
<DIV STYLE="color:black; font-family:Times; font-size:12pt">
<xsl:value-of select="Titel"/>
<xsl:value-of select="Gruppe"/>
</DIV>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Die beiden ursprünglichen Tags <H1> und <p> wurden ersetzt durch <DIV>. Als Attribut STYLE erhält er die Schriftmerkmale zugewiesen. Da sich <Titel> und <Gruppe> innerhalb eines <DIV>-Tags befinden, werden sie hintereinander geschrieben. Wollte man dies verhindern, so müsste man nach <Titel> </DIV> enden lassen:
<DIV STYLE="color:black; font-family:Times; font-size:12pt">
<xsl:value-of select="Titel"/>
</DIV>
<DIV STYLE="color:black; font-family:Times; font-size:12pt">
<xsl:value-of select="Gruppe"/>
</DIV>
Abbildung 10.14
Unterschiedliche Gestaltungen mit XSL
Das Tag <DIV> erzeugt einen automatischen Zeilenumbruch, der hier gewünscht wird. Soll er vermieden werden, so kann statt <DIV> das Tag <SPAN> verwendet werden; dort findet kein Umbruch statt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
<SPAN STYLE="color:red; font-family:Arial; font-size:24pt; font-weight:bold">
<xsl:value-of select="Nummer"/>
</SPAN>
<SPAN STYLE="color:black; font-family:Times; font-size:12pt">
<xsl:value-of select="Titel"/>
</SPAN>
<SPAN STYLE="color:black; font-family:Times; font-size:12pt">
<xsl:value-of select="Gruppe"/>
</SPAN>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Abbildung 10.15
Das gleiche Dokument mit dem Tag <SPAN> statt <DIV>
Normalerweise wird <DIV> für eine Absatzgestaltung verwendet, <SPAN> innerhalb eines Fließtexts für Zeichenformatierung. Will man einen bestimmten Abstand zwischen den einzelnen Absätzen definieren, so kann der Abstand festgelegt werden:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
<DIV STYLE="position:relative; left:75px; top:50px; width:600px; color:red;
font-family:Arial; font-size:24pt; font-weight:bold">
<xsl:value-of select="Nummer"/>
</DIV>
<DIV STYLE="position:relative; left:100px; top:50px; width:600px; color:black;
font-family:Times; font-size:12pt">
<xsl:value-of select="Titel"/>
</DIV>
<DIV STYLE="position:relative; left:100px; top:50px; width:600px; color:black;
font-family:Times; font-size:12pt">
<xsl:value-of select="Gruppe"/>
</DIV>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Abbildung 10.16
Der Text mit Einrückungen
10.2.7 Tabellen
 
Um längere Texte soll es in diesem Buch nicht gehen. Vielmehr stehen Daten im Vordergrund, die ordentlich dargestellt werden sollen. Und dafür stellt HTML bekanntlich Tabellen zur Verfügung:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<STYLE>
<![CDATA[
.Tabellenkopf
{
align:center;
color:red;
font-family:Arial;
font-size:24pt;
font-weight:bold
}
.Tabellengestaltung
{
color:black;
font-family:Times;
font-size:12pt
}
]]>
</STYLE>
<TABLE BORDER="5" WIDTH="100 %">
<TR ALIGN="center">
<TD WIDTH="25 %">
<DIV CLASS="Tabellenkopf">
Nummer
</DIV>
</TD>
<TD WIDTH="50 %">
<DIV CLASS="Tabellenkopf">
Titel
</DIV>
</TD>
<TD WIDTH="25 %">
<DIV CLASS="Tabellenkopf">
Gruppe
</DIV>
</TD>
</TR>
<xsl:for-each select="Artikel/Buch">
<TR>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Nummer"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Titel"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Gruppe"/>
</DIV>
</TD>
</TR>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>
In diesem langen Beispiel stecken nun einige Informationen. Verwendet wurden einige typische HTML-Formate, wie
<TABLE BORDER="5" WIDTH="100 %">
<TR ALIGN="center">
<TD WIDTH="25 %">
um die Breite der Tabelle (100 % der Browserbreite), die Ausrichtung des Kopfs (zentriert) und die Breite der ersten Spalte (25 %) festzulegen. Die zentrierte Ausrichtung ist dabei überflüssig - sie wird bereits im Style »Tabellenkopf« festgelegt:
.Tabellenkopf
{
align:center;
color:red;
font-family:Arial;
font-size:24pt;
font-weight:bold
}
Dieser Stil wird nun für den Kopf verwendet, ein zweiter für die eigentlichen Daten. Alle Elemente des Tags Artikel/Buch werden durchlaufen:
<xsl:for-each select="Artikel/Buch">
Danach wird eine Zeile erzeugt (<TR>), in der Zeile wird die Formatierung verwendet und das Element herausgeholt:
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Nummer"/>
Abbildung 10.17
Die Ausgabe als Tabelle
10.2.8 Daten sortieren
 
Doch XSL hat noch weitere angenehme Eigenschaften. Man kann mit seiner Hilfe die Daten sortieren lassen. Läuft eine Schleife durch alle Datensätze, dann kann man im for-each-Tag bereits festlegen, nach welchem Kriterium die Daten sortiert werden:
<xsl:for-each select="Artikel/Buch" order-by="+ Titel">
Mit Hilfe des Attributs »order-by« wird in Anführungszeichen die Sortierreihenfolge (+ oder -) festgelegt, also aufsteigende oder absteigende Reihenfolge. Danach folgt der Elementname, nach dem sortiert werden soll.
10.2.9 Daten filtern
 
Man kann auch Daten filtern. Leider kann man nicht direkt über ein Kriterium auf den Inhalt eines Elements zugreifen. Aber man kann über Attribute Daten filtern. Angenommen, das obige Beispiel wird ein wenig modifiziert und sieht nun folgendermaßen aus:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate22.xsl" type="text/xsl"?>
<Artikel>
<Buch Nummer="117">
<Titel>Biologisch kochen und backen</Titel>
<Gruppe>Kochbuch</Gruppe>
<Preis>14,90</Preis>
</Buch>
<Buch Nummer="118">
<Titel>Meine Rezepte</Titel>
<Gruppe>Kochbuch</Gruppe>
<Preis>44,90</Preis>
</Buch>
<Buch Nummer="119">
<Titel>Italienische Pasta</Titel>
<Gruppe>Kochbuch</Gruppe>
<Preis>38,80</Preis>
</Buch>
</Artikel>
Die Nummern sind nun Attribute der Buch-Tags. Nun kann man ein Buch oder mehrere Bücher herausfiltern:
...
<xsl:for-each select="Artikel/Buch" order-by="+ Titel">
<xsl:choose>
<xsl:when match="Buch[@Nummer > '117']">
<TR>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="@Nummer"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Titel"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Gruppe"/>
</DIV>
</TD>
</TR>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>
Es fällt das Tag <xsl:when match="Buch[@Nummer = '117']"> auf. In ihm wird das Element angegeben und in eckiger Klammer, getrennt durch einen Klammeraffen, der Name des Attributs. Ein Tag könnte ja mehrere Attribute besitzen. Hinter dem Gleichheitszeichen steht nun der Wert, der gefiltert werden soll. Da match selbst eine Zeichenketten verlangt, die in Anführungszeichen geschrieben ist, muss der Wert (hier 117) in einfache Hochkommata gesetzt werden. Man könnte ebenso die bekannten Vergleichsoperatoren verwenden:
<xsl:when match="Buch[@Nummer > '117']">
Dass die beiden Tags
<xsl:choose>
<xsl:when match="Buch[@Nummer > '117']">
beendet werden müssen, ist klar. Sie finden die Schlusstags in:
</xsl:when>
</xsl:choose>
Analog zu WENN-Funktionen in Excel oder IF-Verzweigungen in VBA gibt es auch hier einen Sonst-Zweig. Er wird mit <xsl:otherwise> eingeleitet und natürlich mit </xsl:otherwise> beendet. Damit könnte man beispielsweise - in Abhängigkeit von einem Kriterium - eine bestimmte Formatierung einschalten.
Abbildung 10.18
Die Daten werden gefiltert und sortiert.
Jedoch Achtung: Da das Attribut im obigen Beispiel keine echte Zahl ist, werden die Attribute wie Zeichenketten verglichen. Das heißt, dass ein Wert <Buch Nummer="99"> ebenso das Kriterium <xsl:when match="Buch[@Nummer = '117']"> erfüllt, da lediglich die Zeichen von links nach rechts gelesen werden.
Und da 9 > 1, folgt 99 > 117. Dieses Problem, das übrigens auch bei der Sortierung auftritt, könnte einfach umgangen werden, indem die Stellen vor der ersten Ziffer »aufgefüllt« werden, zum Beispiel so:
<Buch Nummer="099">
10.2.10 Ebenen durchlaufen
 
Stehen im Zentrum die Daten, dann kann ein Feld dargestellt werden über:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
<p>
<xsl:value-of select="Titel"/>
</p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Sollen dagegen alle Elemente von »Artikel/Buch« angezeigt werden, so kann das select-Kriterium modifiziert werden:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Artikel/Buch">
<p>
<xsl:value-of select="."/>
</p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Auch der umgekehrte Fall ist möglich. Werden beispielsweise die Bücher gesucht, ist aber nicht klar, auf welcher Ebene das Element »Buch« steht (möglicherweise sogar auf unterschiedlichen Ebenen), dann kann das Suchkriterium mit zwei Schrägstrichen geschrieben werden als:
<xsl:for-each select="Artikel//Buch">
Dadurch werden alle Ebenen durchsucht, bis ein Element <Buch> gefunden wurde. Seine Inhalte können dann mit
<xsl:value-of select="."/>
angezeigt werden.
Abbildung 10.19
Alle Daten <xsl:value-of select=«.»/>
10.2.11 Entscheidungen
 
An einem größeren Beispiel soll gezeigt werden, wie in XML gehaltene Daten durch XSL strukturiert ausgegeben werden. Gegeben sei ein (beliebig) großes Dokument, in dem sich Bücher aus verschiedenen Kategorien befinden:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate21.xsl" type="text/xsl"?>
<Artikel>
<Buch Kategorie="Roman">
<Titel>Alle träumten von Cuba</Titel>
<Autor>Miguel Barnet</Autor>
<Jahr>1981</Jahr>
</Buch>
<Buch Kategorie="Roman">
<Titel>Ansichten der Tropen im Morgengrauen</Titel>
<Autor>Guillermo Cabrera Infante</Autor>
<Jahr>1992</Jahr>
</Buch>
<Buch Kategorie="Roman">
<Titel>Drei traurige Tiger</Titel>
<Autor>Guillermo Cabrera Infante</Autor>
<Jahr>1987</Jahr>
</Buch>
<Buch Kategorie="Roman">
<Titel>kolibri</Titel>
<Autor>Severo Sarduy</Autor>
<Jahr>1991</Jahr>
</Buch>
<Buch Kategorie="Roman">
<Titel>Woher die Sänger sind</Titel>
<Autor>Severo Sarduy</Autor>
<Jahr>1993</Jahr>
</Buch>
<Buch Kategorie="Autobiografie">
<Titel>Bevor es Nacht wird</Titel>
<Autor>Reinaldo Arenas</Autor>
<Jahr>1993</Jahr>
</Buch>
<Buch Kategorie="Roman">
<Titel>Rosa</Titel>
<Autor>Reinaldo Arenas</Autor>
<Jahr>1984</Jahr>
</Buch>
<Buch Kategorie="Roman">
<Titel>Reise nach Havanna</Titel>
<Autor>Reinaldo Arenas</Autor>
<Jahr>1994</Jahr>
</Buch>
<Buch Kategorie="Gedichte">
<Titel>Die Plantage</Titel>
<Autor>Reinaldo Arenas</Autor>
<Jahr>1981</Jahr>
</Buch>
</Artikel>
In einer Tabelle sollen nun - so die Vorgabe - zuerst die Gedichte, dann die Romane und am Ende die Autobiografien angezeigt werden. Die XSL-Datei »XSLFormate21.xsl« sieht wie folgt aus:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<STYLE>
<![CDATA[
.Tabellenkopf
{
align:center;
color:red;
font-family:Arial;
font-size:24pt;
font-weight:bold
}
.Tabellengestaltung
{
color:black;
font-family:Times;
font-size:12pt
}
]]>
</STYLE>
<TABLE BORDER="5" WIDTH="100 %">
<TR ALIGN="center">
<TD WIDTH="20 %">
<DIV CLASS="Tabellenkopf">
Autor
</DIV>
</TD>
<TD WIDTH="50 %">
<DIV CLASS="Tabellenkopf">
Titel
</DIV>
</TD>
<TD WIDTH="10 %">
<DIV CLASS="Tabellenkopf">
Jahr
</DIV>
</TD>
<TD WIDTH="20 %">
<DIV CLASS="Tabellenkopf">
Kategorie
</DIV>
</TD>
</TR>
<xsl:for-each select="Artikel/Buch" order-by="+ Autor">
<xsl:choose>
<xsl:when match="Buch[@Kategorie = 'Gedichte']">
<TR>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Autor"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Titel"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Jahr"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="@Kategorie"/>
</DIV>
</TD>
</TR>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<xsl:for-each select="Artikel/Buch" order-by="+ Autor">
<xsl:choose>
<xsl:when match="Buch[@Kategorie = 'Roman']">
<TR>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Autor"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Titel"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Jahr"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="@Kategorie"/>
</DIV>
</TD>
</TR>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<xsl:for-each select="Artikel/Buch" order-by="+ Autor">
<xsl:choose>
<xsl:when match="Buch[@Kategorie = 'Autobiografie']">
<TR>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Autor"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Titel"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Jahr"/>
</DIV>
</TD>
<TD>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="@Kategorie"/>
</DIV>
</TD>
</TR>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>
Abbildung 10.20
Die gefilterten und sortierten Daten
Im oberen CDATA-Abschnitt befinden sich die beiden STYLE-Attribute, mit denen das Dokument gestaltet wird. Dreimal - für jede Kategorie erneut - wird die Schleife for-each bemüht. In ihr wird festgelegt, dass nach Autoren sortiert werden soll:
<xsl:for-each select="Artikel/Buch" order-by="+ Autor">
<xsl:choose>
<xsl:when match="Buch[@Kategorie = 'Gedichte']">
Über das Attribut »Kategorie« wird zuerst die Kategorie »Gedichte« gefiltert, anschließend die Kategorie »Romane« und am Ende die Kategorie »Autobiografie«. Das Ergebnis stellt sich dann wie in Abbildung 10.20 dar.
10.2.12 Bilder
 
Ähnlich wie mit einer .css-Datei können auch mit XSL Bilder angezeigt werden. Angenommen, das Dokument hat folgende Gestalt:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate24.xsl" type="text/xsl"?>
<Liste>
<Buch>
<Titel>Einstieg in XML</Titel>
<ISBN>3898421376</ISBN>
<Seiten>450</Seiten>
<Preis>24,90</Preis>
<Bild>xml.jpg</Bild>
</Buch>
<Buch>
<Titel>C#</Titel>
<ISBN>389842183</ISBN>
<Seiten>570</Seiten>
<Preis>39,90</Preis>
<Bild>csharpe.jpg</Bild>
</Buch>
<Buch>
<Titel>VB.net Jumpstart</Titel>
<ISBN>3898422271</ISBN>
<Seiten>400</Seiten>
<Preis>24,90</Preis>
<Bild>vbnet.jpg</Bild>
</Buch>
</Liste>
Das heißt, die Namen der Bilder befinden sich in den Tags <Bild>. Als solche können sie ausgelesen werden, falls sich die Bilder im gleichen Ordner befinden wie das XML- und das XSL-Dokument. Die zugehörige XSL-Datei »XSLFormate26.xsl« hat demnach folgende Gestalt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<xsl:for-each select="Liste/Buch" order-by="+ Titel">
<DIV STYLE="color:red; font-size:24pt; font-weight:bold; font-family:Arial">
<xsl:value-of select="Titel"/>
</DIV>
<IMG BORDER="0">
<xsl:attribute name="src"><xsl:value-of select="Bild"/>
</xsl:attribute>
</IMG>
<SPAN>Preis: </SPAN>
<SPAN>
<xsl:value-of select="Preis"/>
</SPAN>
<SPAN> / </SPAN>
<SPAN>
<xsl:value-of select="Seiten"/>
</SPAN>
<SPAN>Seiten</SPAN>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Welche Informationen angezeigt werden und wie sie formatiert werden, spielt nun keine Rolle. Interessant ist das Element <IMG>:
<IMG BORDER="0">
<xsl:attribute name="src"><xsl:value-of select="Bild"/>
</xsl:attribute>
</IMG>
Das Tag <xsl:value-of select="Bild"/> ermittelt den Dateinamen und weist ihn dem Attribut »src« des Tags <IMG> zu. Damit wird das Bild angezeigt:
Abbildung 10.21
Die Bilder werden korrekt angezeigt.
Angenommen, die Bilder befinden sich in einem anderen Ordner. Soll nun der Ordner absolut angegeben werden, dann muss mit einem gemischten Element gearbeitet werden:
<IMG BORDER="0">
<xsl:attribute name="src">
C:\Eigene Dateien\Bilder\Galileo\
<xsl:value-of select="Bild"/>
</xsl:attribute>
</IMG>
Pfad und Dateiname werden zusammengesetzt, die Bilder werden korrekt angezeigt. Ebenso können die Dateinamen in Attributen gespeichert werden. Beispielsweise könnte das XML-Dokument so aussehen:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate24.xsl" type="text/xsl"?>
<Liste>
<Buch>
<Titel>Einstieg in XML</Titel>
<ISBN>3898421376</ISBN>
<Seiten>450</Seiten>
<Preis>24,90</Preis>
<Bild Quelle="xml.jpg"/>
</Buch>
<Buch>
<Titel>C#</Titel>
<ISBN>389842183</ISBN>
<Seiten>570</Seiten>
<Preis>39,90</Preis>
<Bild Quelle="csharpe.jpg"/>
</Buch>
<Buch>
<Titel>Einstieg in VB.NET</Titel>
<ISBN>3898422271</ISBN>
<Seiten>400</Seiten>
<Preis>24,90</Preis>
<Bild Quelle="vbnet.jpg"/>
</Buch>
</Liste>
Das Tag <Bild> ist leer - es enthält lediglich das Attribut »Quelle« mit dem Dateinamen als Wert. Diesmal wird nicht der Inhalt eines Elements ausgelesen, sondern das Attribut. Der Pfad soll relativ zum Speicherort der XML-Datei angegeben werden; die Bilder befinden sich in einem Unterordner »Bilder«:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<STYLE>
<![CDATA[
.Tabellengestaltung
{
color:black;
font-family:Times;
font-size:12pt
}
]]>
</STYLE>
<SPAN STYLE="color:red; font-family:Arial; font-weight:bold; font-size:24pt">
Literaturliste</SPAN>
<TABLE BORDER="0" WIDTH="100 %">
<xsl:for-each select="Liste/Buch" order-by="+ Titel">
<TR>
<TD WIDTH="10 %">
<IMG>
<xsl:attribute name="src">
<xsl:value-of select="Bild/@Quelle"/>
</xsl:attribute>
</IMG>
</TD>
<TD WIDTH="90 %">
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Titel"/>
</DIV>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="ISBN"/>
</DIV>
</TD>
</TR>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>
Das Tag <IMG> wurde oben bereits beschrieben. Nun holt es ein Attribut aus dem Element. Dies wird durch den Klammeraffen gekennzeichnet:
<IMG>
<xsl:attribute name="src">
<xsl:value-of select="Bild/@Quelle"/>
</xsl:attribute>
</IMG>
10.2.13 Hyperlinks
 
Nun dürfte es eigentlich kein Problem mehr sein, mit Hilfe von XSL Informationen aus Elementen oder Attributen herauszuholen und als Hyperlink darzustellen. Gegeben sei folgende abgekürzte Literaturliste:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="XSLFormate28.xsl" type="text/xsl"?>
<Liste>
<Buch>
<Titel>Einstieg in VB.NET</Titel>
<ISBN>3898422271</ISBN>
<Seiten>400</Seiten>
<Preis>24,90</Preis>
<Bild Quelle="vbnet.jpg"/>
<Homepage xml:link="simple" href="http://www.galileocomputing.de">
Weitere Informationen</Homepage>
</Buch>
...
</Liste>
Jedes Buchelement enthält einen Tag <Homepage>, welcher die Internet-Adresse des Verlags beinhaltet. Dieser wird in der Datei »XSLFormate28.xsl« ausgelesen und dargestellt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
...
<SPAN STYLE="color:red; font-family:Arial; font-weight:bold; font-size:24pt">
Literaturliste</SPAN>
<TABLE BORDER="0" WIDTH="100 %">
<xsl:for-each select="Liste/Buch" order-by="+ Titel">
<TR>
<TD WIDTH="10 %">
<IMG>
<xsl:attribute name="src">
Bilder\<xsl:value-of select="Bild/@Quelle"/>
</xsl:attribute>
</IMG>
</TD>
<TD WIDTH="90 %">
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="Titel"/>
</DIV>
<DIV CLASS="Tabellengestaltung">
<xsl:value-of select="ISBN"/>
</DIV>
<A CLASS="Tabellengestaltung">
<xsl:attribute name="HREF">
<xsl:value-of select="Homepage/@href"/>
</xsl:attribute>
<xsl:value-of select="Homepage"/>
</A>
</TD>
</TR>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>
Das Ergebnis kann sich sehen lassen.
Abbildung 10.22
Die Hyperlinks wurden mit XSL erzeugt.
10.2.14 Zusammenfassung von XSL
 
In diesem Kapitel wurde beschrieben, wie eine XML-Datei dargestellt werden kann. Die wohl wichtigste Möglichkeit heißt XSL (»Extensible Stylesheet Language«). Damit können Daten flexibel aus dem XML-Dokument gefiltert und anschließend sortiert werden, Attributwerte können ausgelesen und dargestellt werden. Gleichzeitig stehen die HTML-Tags zur Formatierung, exakten Positionierung und zur Darstellung von Tabellen zur Verfügung. Eine besondere Rolle spielen die beiden Tags <SPAN> und <DIV>, da mit ihrer Hilfe Formatierungen frei vergeben werden können.
|